home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
wais
/
ui
/
util.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-09
|
3KB
|
144 lines
/*
WIDE AREA INFORMATION SERVER SOFTWARE:
No guarantees or restrictions. See the readme file for the full standard
disclaimer.
This is part of the shell user-interface tools for the WAIS software.
Do with it as you please.
jonathan@Think.COM
* $Log: util.c,v $
* Revision 1.13 92/03/17 14:32:21 jonathan
* Generally cleaned up.
*
* Revision 1.12 92/03/08 09:17:48 jonathan
* Fixed strip_lf.
*
* Revision 1.11 92/03/08 09:12:33 jonathan
* Added new function, strip_lf.
*
*/
#ifndef lint
static char *RCSid = "$Header: /tmp_mnt/net/quake/proj/wais/wais-8-b5/ui/RCS/util.c,v 1.13 92/03/17 14:32:21 jonathan Exp $";
#endif
#define _C_UTIL
#include "wais.h"
#include "globals.h"
int charlistlength(list)
char **list;
{
int num;
if(list) {
for(num = 0; list[num] != NULL; num++);
return num;
}
else
return 0;
}
int listlength(list)
List list;
{
int num;
List l;
for(num = 0, l = list; l != NULL; num++, l = l->nextNode);
return num;
}
#define BEFORE 1
#define DURING 2
#define QUOTE 5
/* ripped out of gmacs-ui.c */
int find_string_slot(source, key, value, value_size, delete_internal_quotes)
char *source, *key, *value;
long value_size;
Boolean delete_internal_quotes;
{
char ch;
short state = BEFORE;
long position = 0; /* position in value */
char *pos =strstr(source, key); /* address into source */
value[0] = '\0'; /* initialize to nothing */
if(NULL == pos)
return(1);
for(pos = pos + strlen(key); pos < source + strlen(source); pos++){
ch = *pos;
if((state == BEFORE) && (ch == '\"'))
state = DURING;
else if ((state == DURING) && (ch == '\\')){
state = QUOTE;
if(!delete_internal_quotes){
value[position] = ch;
position++;
if(position >= value_size){
value[value_size - 1] = '\0';
return(-1);
}
}
}
else if ((state == DURING) && (ch == '"')){
value[position] = '\0';
return(0);
}
else if ((state == QUOTE) || (state == DURING)){
if(state == QUOTE)
state = DURING;
value[position] = ch;
position++;
if(position >= value_size){
value[value_size - 1] = '\0';
return(-1);
}
}
/* otherwise we are still before the start of the value */
}
value[position] = '\0';
return(-1); /* error because we are in the middle of the string */
}
void find_value(source, key, value, value_size)
char *source, *key, *value;
int value_size;
{
char ch;
long position = 0; /* position in value */
char *pos =strstr(source, key); /* address into source */
value[0] = '\0'; /* initialize to nothing */
if(NULL == pos)
return;
pos = pos + strlen(key);
ch = *pos;
/* skip leading quotes and spaces */
while((ch == '\"') || (ch == ' ')) {
pos++; ch = *pos;
}
for(position = 0; pos < source + strlen(source); pos++){
if((ch = *pos) == ' ') {
value[position] = '\0';
return;
}
value[position] = ch;
position++;
if(position >= value_size){
value[value_size - 1] = '\0';
return;
}
}
value[position] = '\0';
}